package com.cskaoyan.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;

@Component
public class CustomAspect {

    //通知方法名可以自定义
    public void before() {
        System.out.println("正道的光");
    }
    public void after(){
        System.out.println("照在大地上");
    }

    //around 👉 类似于InvocationHandler的invoke方法（MethodInterceptor的invoke方法）
    //里面都有委托类方法的调用 👉 around替代了委托类的方法

    /**
     * 返回值为Object:容器中取出的代理组件执行的结果
     * 形参中包含ProceedingJoinPoint：可以执行到委托类的方法；获得增强过程中的值
     */
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("around的前半部分");
        //如何执行到委托类方法 → proceedingJoinPoint.proceed
        //如果委托类中的方法携带的参数不需要改变：joinPoint.proceed()
        //如果委托类中的方法携带的参数需要改变：joinPoint.proceed(Object[])
        Object proceed = joinPoint.proceed();
        /*Object proceed = null;
        try {
            proceed = joinPoint.proceed();
        } catch (Throwable throwable) {
            //throwable.printStackTrace();
        }

        System.out.println("around的后半部分");
    */
        return proceed + "***";
    }

    //after-returning通知
    //在委托类方法执行return之后执行 → 拿到委托类方法的执行结果
    //使用Object来接收委托类方法的执行结果
    public void afterReturning(Object result) {
        System.out.println("afterReturning通知接收到的委托类方法的执行结果：" + result);
    }

    //after-throwing通知：委托类方法（Around通知）抛出异常的时候，会执行到这个通知
    //可以接收到异常对象：Exception、Throwable
    public void afterThrowing(Exception exception) {
        System.out.println("抛出异常：" + exception.getMessage());
    }

}
